﻿using System;
using System.Collections.Generic;
using System.Text;
using System.IO.Ports;
using System.Timers;

namespace SandBox
{
    class CallerId
    {
        private static SerialPort _serial;
        /// <summary>
        /// El SerialPort que escucha el modem. A traves de él se identificaran las llamadas entrantes.
        /// </summary>
        public static SerialPort Serial{get { return CallerId._serial; }set { CallerId._serial = value; }}
        
        private static ASCIIEncoding ASCIIEnconder = new ASCIIEncoding();
        
        private string _port;
        /// <summary>
        /// La dirección del puerto que se escuchará para identificar llamadas.
        /// </summary>
        public string Port{get { return _port; }}
       
        private int _baud;
        /// <summary>
        /// La velocidad en Baudios que maneja el puerto.
        /// </summary>
        public int Baud{get { return _baud; }}

        /// <summary>
        /// Constructor por defecto de un objeto que identifica llamadas.
        /// </summary>
        /// <param name="port">La dirección del puerto que se escuchará para identificar llamadas.</param>
        /// <param name="baud">La velocidad en Baudios que maneja el puerto.</param>
        public CallerId(string port, int baud)
        {
            this._port = port;
            this._baud = baud;
            try
            {
                this.OpenConnection();
                //Activar IDENTIFICADOR de LLAMADAS
                string CommandATID = "AT#CID=1";
                _serial.Write(CommandATID + '\r');
            }
            catch (Exception ex)
            {
                throw new CallerIdException(ex.Message);
            }
        }

        /// <summary>
        /// Configura todos los paremetros para que iniciar la escucha a esperas de nuevas llamadas.
        /// </summary>
        private void OpenConnection()
        {
            try
            {
                _serial = new SerialPort(_port, _baud);
                _serial.Parity = Parity.None;
                _serial.StopBits = StopBits.One;
                _serial.DataBits = 8;
                _serial.Handshake = Handshake.None;
                //El evento que captura una nueva llamada:
                _serial.DataReceived += new SerialDataReceivedEventHandler(_serial_DataReceived);
                _serial.Open();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        /// <summary>
        /// Evento que se activa cuando llega nueva información desde el puerto (AKA 'Nueva llamada').
        /// </summary>
        public static void _serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string data = _serial.ReadExisting();
            string ring_date = string.Empty;
            string ring_time = string.Empty;
            string ring_number = string.Empty;

            if (data.Length >= 30)
            {
                DateTime date = DateTime.Now;
                //ring_date = data.Substring(7, 4);
                //ring_time = data.Substring(20, 4);
                ring_number = data.Substring(33, 10);
                RecordCall(date, ring_number);
            }
        }
        /// <summary>
        /// Registra la llamada identificada.
        /// </summary>
        /// <param name="date"></param>
        /// <param name="ring_number"></param>
        /// <returns>Un objeto de la clase Call con la información de la llamada.</returns>
        private static Call RecordCall(DateTime date, string ring_number)
        {
            Call c = new Call(date, ring_number);
            Console.WriteLine(c.ToString());
            return c;
        }
    }
}
